// 导入axios和所需的类型
import axios, {
  AxiosInstance,
  AxiosError,
  AxiosResponse,
  InternalAxiosRequestConfig,
} from "axios";

// 默认配置
const service: AxiosInstance = axios.create({
  // baseURL: import.meta.env.VITE_API_BASE || "/", // 设置API的基本URL，默认为根路径
});

// 请求拦截器，对请求配置进行一些处理或设置
service.interceptors.request.use(
  (config: InternalAxiosRequestConfig) => {
    return config;
  },
  (error: AxiosError) => {
    return Promise.reject(error);
  },
);

// 响应拦截器，对响应结果进行处理或判断
service.interceptors.response.use(
  (response: AxiosResponse) => {
    if (response.status === 200) {
      return response.data;
    }
    return Promise.reject(); // 如果响应状态不是200，则返回一个拒绝的Promise
  },
  (error: AxiosError) => {
    return Promise.reject(error);
  },
);

export default service; // 导出封装好的axios实例

// 定义结果接口Result
export interface Result<T = unknown> {
  message: string;
  code: number;
  data: T;

  [key: string]: any; // 其他任意属性
}

export const http = {
  // 发送GET请求的方法，可指定数据类型T，并返回一个Promise对象，其值为Result<T>类型
  get<T = any>(url: string, data?: object): Promise<Result<T>> {
    return service.get<T, Result<T>>(url, data);
  },

  // 发送POST请求的方法，同样可指定数据类型T，并返回一个Promise对象
  post<T = any>(url: string, data?: object): Promise<Result<T>> {
    return service.post<T, Result<T>>(url, data);
  },

  // 发送PUT请求的方法，同样可指定数据类型T，并返回一个Promise对象
  put<T = any>(url: string, data?: object): Promise<Result<T>> {
    return service.put<T, Result<T>>(url, data);
  },

  // 发送DELETE请求的方法，同样可指定数据类型T，并返回一个Promise对象
  delete<T = any>(url: string): Promise<Result<T>> {
    return service.delete<T, Result<T>>(url);
  },
};
